package com.star.spring.redis.controller;

import com.star.spring.redis.utils.RedisUtil;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * Redis操作测试控制器
 */
@RestController
@RequestMapping("/redis")
public class RedisController {

    private final RedisUtil redisUtil;

    public RedisController(RedisUtil redisUtil) {
        this.redisUtil = redisUtil;
    }

    /**
     * 测试String操作
     */
    @GetMapping("/string")
    public Map<String, Object> testString(@RequestParam String key, @RequestParam String value) {
        Map<String, Object> result = new HashMap<>();
        
        // 设置值
        redisUtil.set(key, value);
        result.put("set", true);
        
        // 获取值
        Object getValue = redisUtil.get(key);
        result.put("get", getValue);
        
        // 设置过期时间
        redisUtil.expire(key, 60, TimeUnit.SECONDS);
        result.put("expire", 60);
        
        // 获取过期时间
        long expireTime = redisUtil.getExpire(key);
        result.put("getExpire", expireTime);
        
        return result;
    }

    /**
     * 测试Hash操作
     */
    @GetMapping("/hash")
    public Map<String, Object> testHash(@RequestParam String key) {
        Map<String, Object> result = new HashMap<>();
        
        // 设置Hash值
        redisUtil.hashSet(key, "name", "测试名称");
        redisUtil.hashSet(key, "age", 25);
        redisUtil.hashSet(key, "email", "test@example.com");
        result.put("set", true);
        
        // 获取Hash值
        Object name = redisUtil.hashGet(key, "name");
        Object age = redisUtil.hashGet(key, "age");
        Object email = redisUtil.hashGet(key, "email");
        
        Map<String, Object> hashValues = new HashMap<>();
        hashValues.put("name", name);
        hashValues.put("age", age);
        hashValues.put("email", email);
        result.put("get", hashValues);
        
        // 获取所有Hash值
        Map<Object, Object> allEntries = redisUtil.hashEntries(key);
        result.put("entries", allEntries);
        
        // 设置过期时间
        redisUtil.expire(key, 120, TimeUnit.SECONDS);
        result.put("expire", 120);
        
        return result;
    }

    /**
     * 测试List操作
     */
    @GetMapping("/list")
    public Map<String, Object> testList(@RequestParam String key) {
        Map<String, Object> result = new HashMap<>();
        
        // 清除可能存在的旧数据
        redisUtil.delete(key);
        
        // 添加List元素
        redisUtil.listRightPush(key, "元素1");
        redisUtil.listRightPush(key, "元素2");
        redisUtil.listRightPush(key, "元素3");
        result.put("push", true);
        
        // 获取List大小
        long size = redisUtil.listSize(key);
        result.put("size", size);
        
        // 获取List所有元素
        Object listValues = redisUtil.listRange(key, 0, -1);
        result.put("values", listValues);
        
        // 设置过期时间
        redisUtil.expire(key, 180, TimeUnit.SECONDS);
        result.put("expire", 180);
        
        return result;
    }

    /**
     * 测试Set操作
     */
    @GetMapping("/set")
    public Map<String, Object> testSet(@RequestParam String key) {
        Map<String, Object> result = new HashMap<>();
        
        // 清除可能存在的旧数据
        redisUtil.delete(key);
        
        // 添加Set元素
        long addCount = redisUtil.setAdd(key, "元素A", "元素B", "元素C", "元素A");  // 重复元素会被忽略
        result.put("add", addCount);
        
        // 获取Set大小
        long size = redisUtil.setSize(key);
        result.put("size", size);
        
        // 获取Set所有元素
        Set<Object> members = redisUtil.setMembers(key);
        result.put("members", members);
        
        // 判断元素是否存在
        boolean exists = redisUtil.setIsMember(key, "元素B");
        result.put("isMember", exists);
        
        // 设置过期时间
        redisUtil.expire(key, 240, TimeUnit.SECONDS);
        result.put("expire", 240);
        
        return result;
    }

    /**
     * 测试ZSet操作
     */
    @GetMapping("/zset")
    public Map<String, Object> testZSet(@RequestParam String key) {
        Map<String, Object> result = new HashMap<>();
        
        // 清除可能存在的旧数据
        redisUtil.delete(key);
        
        // 添加ZSet元素
        redisUtil.zSetAdd(key, "成员A", 90.5);
        redisUtil.zSetAdd(key, "成员B", 87.0);
        redisUtil.zSetAdd(key, "成员C", 95.5);
        result.put("add", true);
        
        // 获取ZSet大小
        long size = redisUtil.zSetSize(key);
        result.put("size", size);
        
        // 获取ZSet所有元素
        Set<Object> range = redisUtil.zSetRange(key, 0, -1);
        result.put("range", range);
        
        // 获取指定分数范围的元素
        Set<Object> scoreRange = redisUtil.zSetRangeByScore(key, 90, 100);
        result.put("scoreRange", scoreRange);
        
        // 获取指定元素的分数
        Double score = redisUtil.zSetScore(key, "成员A");
        result.put("score", score);
        
        // 设置过期时间
        redisUtil.expire(key, 300, TimeUnit.SECONDS);
        result.put("expire", 300);
        
        return result;
    }
}
